DAL ReadOne of SelectOne methode
Home

DAL ReadOne of SelectOne methode

DAL ReadOne of SelectOne methode

De SelectOne methode haalt 1 rij op uit de onderliggende tabel.

Probleem

We moeten één rij uit een SQL tabel kunnen omzetten naar een gegevenstype dat door C# begrepen en gemanipuleerd kan worden. We geven de Id als parameter mee en retourneren een Bll object.

Design

We zetten één rij van de tabel om in een object van het type EventCategory model. We moeten er rekening mee houden dat een kolom in SQL de waarde NULL kan hebben. Om geen foutemelding in C# te krijgen moeten we die mogelijkheid onderscheppen door eerst te testen als de kolom geen NULL waarde heeft. Dat doen we met de IsDbNull methode. De GetOrdinal methode retourneert het volgnummer van de kolom in de tabel en dus ook in de datadictionary die door de datareader geretourneerd wordt.

Oplossing

  1. De IDal interface aanpassen:
    using System.Collections.Generic;
    namespace FricFrac.Dal
    {
        interface IDal<T>
        {
            string Message { get; }
            int RowCount { get; }
            List<T> ReadAll();
            T ReadOne(int id);
        }
    }
  2. De ReadOne methode toevoegen aan Dal.EventCategory klasse:
    public Bll.EventCategory ReadOne(int Id)
    {
        MySqlConnection connection = new MySqlConnection(this.connectionString);
        // in de CommandText parameter geven we de naam van de stored procedure mee
        MySqlCommand command = new MySqlCommand("EventCategorySelectOne", connection);
        // zeg aan het command object dat het een stored procedure
        // zal krijgen en geen SQL Statement
        command.CommandType = CommandType.StoredProcedure;
        MySqlParameter pId = new MySqlParameter();
        pId.ParameterName = "pId";
        pId.DbType = DbType.Int32;
        pId.Value = Id;
        command.Parameters.Add(pId);
        Message = "Niets te melden";
        // we gaan ervan uit dat het mislukt
        MySqlDataReader result = null;
        RowCount = 0;
        Bll.EventCategory bll = new Bll.EventCategory();
        using (connection)
            {
            try
            {
                connection.Open();
                //Verbinding geslaagd
                this.message = "Connectie is open";
                using (result = command.ExecuteReader())
                {
                    if (result.HasRows)
                    {
                        // lees de gevonden rij in
                        result.Read();
                        Message = $"EventCategory met Id {Id} is gevonden. De naam van de categorie is {result["Name"]}";
                        bll.Name = (result.IsDBNull(result.GetOrdinal("Name")) ? "" : result["Name"].ToString());
                        bll.Id = (result.IsDBNull(result.GetOrdinal("Id")) ? 0 : Int32.Parse(result["Id"].ToString()));
                        RowCount = 1;
                    }
                    else
                    {
                        Message = $"EventCategory met Id {Id} is niet gevonden.";
                    }
                }
            }
            catch (MySqlException e)
            {
                Message = e.Message;
            }
        }
        return bll;
    }

Testen

  1. Voeg de ReadOne methode toe in IDal:
    using System.Collections.Generic;
    namespace FricFrac.Dal
    {
        interface IDal<T>
        {
            string Message { get; }
            int RowCount { get; }
            List<T> ReadAll();
            T ReadOne(int id);
        }
    }
  2. Vervolledig de methode FricFracDalTest in het bestand Learning.cs:
    public static void FricFracDalTest()
    {
        Console.WriteLine("Fric-frac DAL test");
        FricFrac.Dal.EventCategory dal = new FricFrac.Dal.EventCategory();
        List<FricFrac.Bll.EventCategory> list = dal.ReadAll();
        Console.WriteLine($"{dal.RowCount} {dal.Message}");
        foreach (FricFrac.Bll.EventCategory item in list)
            Console.WriteLine("{0} {1}", item.Id, item.Name);
        dal.ReadOne(4);
        Console.WriteLine($"{dal.RowCount} {dal.Message}");
        dal.ReadOne(200);
        Console.WriteLine($"{dal.RowCount} {dal.Message}");
    }
  3. Roep de methode op in Program.cs:
    using System;
    namespace AdoDotNet
    {
        class Program
        {
            public static void Main(string[] args)
            {
                Console.WriteLine("Leren werken met ADO.NET in .NET Core!");
                // Learning.TestMySqlConnector();
                // Learning.ReflectPropertiesTryOut();
                // Learning.LearnDotNetCoreConfigurationApi();
                Learning.FricFracDalTest();
                Console.ReadKey();
            }
        }
    }
  4. En dat is het resultaat:
    Visual Studio Result Test ADO.NET DAL ReadOne
    Visual Studio Result Test ADO.NET DAL ReadOne

JI
2017-09-15 15:54:56